//引入dateformat第三方模块，用于处理时间格式
const dateFormat = require('dateformat');

const morgan = require('morgan');

//导入config模块，用于抽取并管理配置信息
const config = require('config');
const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const app = express();
//导入express-session模块，用于记录用户登录状态
const session = require('express-session');

//导入art-template模板引擎、
const template = require('art-template');

//连接数据库
require('./model/connect');

//处理post请求参数
app.use(bodyParser.urlencoded({ extended: false }));

//配置session
//通过app.use拦截所有请求，在其中调用session方法处理请求
//session会为请求创建session对象，并通过secret参数进行加密处理
app.use(session({
    secret: 'secret key',
    saveUninitialized: false,
    cookie: {
        maxAge: 24 * 60 * 60 * 1000,
    }
}));

//配置模板引擎
app.engine('art', require('express-art-template')); //使用 引擎
app.set('views', path.join(__dirname, 'views')); //模板路径
app.set('view engine', 'art'); //默认后缀
template.defaults.imports.dateFormat = dateFormat; //导入外部变量

//开放静态资源文件
app.use(express.static(path.join(__dirname, 'public')));

console.log(config.get('title'));

//process对象为global全局对象下的一个对象属性，因此可在全局直接调用
//通过其下的env属性，获取系统环境变量，返回值为一个对象，可以继续打点拿到其下具体的环境变量
if (process.env.NODE_ENV == 'development') {
    console.log('当前是开发环境');
    //在开发环境中，将客户端发送到服务器端的请求，打印到控制台当中
    app.use(morgan('dev'))
} else {
    console.log('当前是生产环境');
}


//引入路由对象
const home = require('./route/home');
const admin = require('./route/admin');

//拦截所有以/admin开头的请求，判定用户的登录状态
app.use('/admin', require('./middleware/loginGuard'));

//为客户端路由匹配路径(一级路由)
app.use('/home', home);
app.use('/admin', admin);

//定义错误处理中间件
app.use((err, req, res, next) => {
    //错误处理中间件触发后，next传过来的参数相当于这里的err
    //先使用JSON.parse()方法将字符串转化为对象类型
    const result = JSON.parse(err);
    let params = [];
    for (let attr in result) {
        if (attr != 'path') {
            params.push(attr + '=' + result[attr]);
        }
    }
    res.redirect(`${result.path}?${params.join('&')}`);
})



app.listen(80);
console.log('网站服务器启动成功，请访问localhost');